package com.battery.system.service.battery;

import com.battery.common.core.domain.AjaxResult;
import com.battery.common.utils.BatteryJSONResult;
import com.battery.common.utils.ali.AliPayEntity;
import com.battery.system.domain.AppUser;
import com.battery.system.domain.AuthUsed;
import com.battery.system.domain.BO.OrderBO;
import com.battery.system.domain.Device;
import com.battery.system.domain.Order;
import com.battery.system.domain.VO.OrderDetails;
import com.battery.system.domain.VO.OrderVO;
import com.battery.system.service.IBaseService;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 支付订单Service接口
 *
 * @author battery
 * @date 2021-01-22
 */
public interface IOrderService extends IBaseService<Order> {
    /**
     * 查询支付订单
     *
     * @param id 支付订单ID
     * @return 支付订单
     */
    public Order selectOrderById(String id);

    /**
     * 查询支付订单列表
     *
     * @param order 支付订单
     * @return 支付订单集合
     */
    public List<Order> selectOrderList(Order order);

    /**
     * 新增支付订单
     *
     * @param order 支付订单
     * @return 结果
     */
    public int insertOrder(Order order);

    /**
     * 修改支付订单
     *
     * @param order 支付订单
     * @return 结果
     */
    public int updateOrder(Order order);

    /**
     * 批量删除支付订单
     *
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    public int deleteOrderByIds(String ids);

    /**
     * 删除支付订单信息
     *
     * @param id 支付订单ID
     * @return 结果
     */
    public int deleteOrderById(String id);

    /**
     * 查询未使用的微信押金
     *
     * @param appUserId
     * @return
     */
    List<Order> noUsedWxDeposit(String appUserId);

    /**
     * 微信小程序支付统一下单
     *
     * @param appUser 用户信息
     * @param device  设备信息
     * @param amount  支付金额
     * @param type    状态
     * @param extra   扩展参数
     * @return
     */
    BatteryJSONResult wxPayRecharge(AppUser appUser, Device device, BigDecimal amount, Integer type, String extra);

    /**
     * 根据订单号查询对应的订单信息
     *
     * @param out_trade_no
     * @return
     */
    Order selectByOutTradeNo(String out_trade_no);

    /**
     * 微信小程序支付回调处理
     *
     * @param order          支付订单
     * @param transaction_id
     * @return
     */
    String wxPayNotifyOrder(Order order, String transaction_id);


    /**
     * 查询支付宝用户未支付的订单
     *
     * @param appUserId
     * @return
     */
    List<Order> noUsedALiDeposit(String appUserId);


    /**
     * 支付宝支付 统一下单
     *
     * @param appUser 用户信息
     * @param device  设备信息
     * @param amount  支付金额
     * @param type    订单类型
     * @param extra   扩展参数
     * @param entity
     * @return
     */
    BatteryJSONResult aliPayRecharge(AppUser appUser, Device device, BigDecimal amount, Integer type, String extra, AliPayEntity entity);


    /**
     * 支付宝支付回调处理
     *
     * @param order            支付订单
     * @param queryTradeStatus 支付订单状态
     * @return
     */
    String aliPayNotifyOrder(Order order, String queryTradeStatus);

    /**
     * 支付宝授权支付回调通知
     *
     * @param order    支付订单
     * @param authUsed 授权订单
     * @param params
     * @return
     */
    String aliFreezePayNotify(Order order, AuthUsed authUsed, Map<String, String> params);

    /**
     * 查询支付订单列表
     *
     * @param orderBO
     * @return
     */
    List<OrderVO> selectOrderVOList(OrderBO orderBO);

    OrderDetails selectOrderUsedIncome(String id);

    /**
     * 后台 退押金操作
     *
     * @param orderId
     * @param aliPayEntity
     * @return
     */
    AjaxResult backstageRefundDeposit(String orderId, AliPayEntity aliPayEntity);

    /**
     * 后台 退款操作
     *
     * @param updateOrder
     * @param aliPayEntity
     * @return
     */
    AjaxResult backstageRefundMoney(Order updateOrder, AliPayEntity aliPayEntity);

    /**
     * 查询该用户是否存在支付完毕但是未出密码的支付订单
     *
     * @param appUserId
     * @param sn
     * @return
     */
    Order isHasOrderNotLineOrder(String appUserId, String sn);

    /**
     * 查询用户正常押金且未标记的押金
     *
     * @param id
     * @return
     */
    List<Order> noUsedWxDepositNoSign(String id);

    /**
     * 查询该用户正常押金之和
     *
     * @param appUserId
     * @return
     */
    BigDecimal noUsedWxDepositSum(String appUserId);

    /**
     * 查询该用户正常押金之和 - 支付宝
     *
     * @param appUserId
     * @return
     */
    BigDecimal noUsedAliDepositSum(String appUserId);

    /**
     * 查询该用户未标记的正常押金信息（支付宝）
     *
     * @param appUserId
     * @return
     */
    List<Order> noUsedALiDepositNoSign(String appUserId);
}
